package com.kingwang.training.designpattern.strategy;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class StrategyApplication implements ApplicationRunner {

    public static void main(String[] args) {
        SpringApplication.run(StrategyApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {

    }

    private void badWay() {
        /*
        假设我们现在正在开发一款类似植物大战僵尸的游戏产品
        产品经理告诉我们说：所有僵尸的必要条件是可以动，可以攻击，外观上可以区分就可以了
        
        这没问题，写一个抽象类GameCharacter,然后让所有角色（僵尸）继承这个类就可以了。So Easy.
         */

        /*
        产品经理走过来对我说，我们需要给我们每个僵尸设置一个前进速度，而且速度要有区别，不能所有僵尸都一样的。
        设置速度嘛，也简单，我在抽象类里面添加一个speed的方法，让红头僵尸和绿头僵尸都分别实现这个方法。也不难，分分种搞定
         */

        /*
        产品经理这时走过来告诉你，僵尸的攻击方式不能一样的，你怎么让所有僵尸的攻击方式都一样了，这肯定不行的
        好像有点道理的样子，那就改咯。重写所有的attack方法不就行了
         */

        /*
        产品经理觉得需要再添加两种僵尸（短腿僵尸，无攻击力僵尸）
        短腿僵尸速度很慢，但是可以远程攻击
        无攻击力僵尸（不知道用来干嘛，可能是后勤部队，用来给其他僵尸运送军火的）可以移动，但是不能攻击
        继续写两个类ShortLegZombie(短腿)，NoAttackZombie（无攻击）继承自GameCharacter
         */


        /*
        产品经理又走过来说，刚刚开会了，我们最后的决定是，你们开发再多添加下面几种僵尸来增加游戏的可玩性，丰富界面，提高用户可选性，辛苦你们了，最近加加班咯
        一看，四十几种
        好吧好吧,我写，我写可以吧？……四十几个僵尸类继承GameCharacter重写不同的diaplay(),speed(),attack()方法。（这个僵尸类百分百有其他变动，先写两个，等你下个需求我再看怎么修改咯！）
         */

        /*
        又添加了几个僵尸类，先拿给产品看一下。
        产品一看，眼睛微眯，皱着眉头：你这不行呀，你这僵尸怎么速度都是不变的？你遇到障碍物肯定的减速，没有障碍物得加速呀，这个要修改。僵尸在起跑线应该都不具有攻击方式，你这个攻击方式需要修改下。
        听他这么一说好像有点道理，当僵尸满足某个条件时修改下速度状态和攻击方式。当是我现在已经创建十几个僵尸类了，这要修改的工作量有点大呀！而且还有几十种都没写上去呢！
        能不能优化一下代码，让新建一个僵尸类的时候尽量用几行代码就搞定，而且可以随时修改其状态呢？
         */
    }

    public void strategyWay() {
        /*
        重写梳理下思路：我们编写一个抽象类（GameCharacter），让所有的僵尸都继承这个类。
        速度和攻击方式是可以动态改变的。我们将需要动态改变的部分抽取出来。
        分别编写SpeedStrategy和AttackStrategy两个接口，将所有的速度和攻击行为都抽取出来。
        速度和攻击这里暂时各写三种：低速、中速和高速；近战攻击、远程攻击和大招攻击

        随便你添加角色，随便你修改速度和攻击状态，我能随时修改
         */
    }
}
